package adapters;

import java.util.ArrayList;

import com.tdam_2012_g7.R;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.Filter;
import android.widget.Filterable;
import android.widget.ImageView;
import android.widget.TextView;
import entidades.AccionItem;


public class ItemAccionAdapter extends ArrayAdapter<AccionItem> implements Filterable{

	private ArrayList<AccionItem> items;
	private AccionItem accion;
	private static final String REC_MESSAGE = "Mensaje recibido"; // 1
	private static final String SENT_MESSAGE = "Mensaje enviado"; // 2
	private static final String SENT_EMAIL = "Email enviado"; // 3
	private static final String REC_EMAIL = "Email recibido"; // 4
	private static final String INC_CALL = "Llamada entrante"; // 5
	private static final String OUT_CALL = "Llamada saliente"; // 6
	private static final String LOST_CALL = "Llamada perdida"; // 7
	private static final int COD_VER_TODOS = 10;
	
	private FilterLlamada filtroLlamada;
	private FilterAcciones filtroAcciones;
	
	public ItemAccionAdapter(Context context, int textViewResourceId,
			ArrayList<AccionItem> items) {
		super(context, textViewResourceId, items);
		this.items = items;
	}

	public int getCount(){
		return items.size();
	}
	
	@Override
	public View getView(int position, View convertView, ViewGroup parent) {
		View v = convertView;
		if (v == null) {
			LayoutInflater vi = (LayoutInflater) this.getContext()
					.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

			v = vi.inflate(R.layout.item_accion, null);
		
		}
		accion = items.get(position);
		if (accion != null) {
			TextView nombre = (TextView) v
					.findViewById(R.id.txtNombreContactoHistorial);
			TextView desc = (TextView) v.findViewById(R.id.txtDescripcionH);
			TextView fecha = (TextView) v.findViewById(R.id.txtFechaAccion);
			ImageView image = (ImageView) v.findViewById(R.id.imgAccion);

			fecha.setText(accion.getFecha());
			if(accion.getNombreContacto()!=null){
				desc.setText(accion.getNombreContacto()+": "+accion.getDescripcion());
			}
			else{
				desc.setText(accion.getDescripcion());
			}
			
			switch(accion.getIdTipoAccion()){
			case 1:
				construirAccionMensajeRecibido(nombre, image);
				break;
			case 2:
				construirAccionMensajeEnviado(nombre,  image);
				break;
			case 3:
				construirAccioEmailEnviado(nombre, image);
				break;
			case 4:
				construirAccioEmailRecibido(nombre, image);
				break;
			case 5:
				construirAccioLlamadaEntrante(nombre,image);
				break;
			case 6:
				construirAccioLlamadaSaliente(nombre,image);
				break;
			case 7:
				construirAccioLlamadaPerdida(nombre,image);
				break;
			}
			
		}
		return v;
	}

	private void construirAccionMensajeEnviado(TextView name,
			ImageView im) {
		name.setText(SENT_MESSAGE);
		im.setImageResource(R.drawable.mensaje_off);
	}

	private void construirAccionMensajeRecibido(TextView name, 
			ImageView im) {
		name.setText(REC_MESSAGE);
		im.setImageResource(R.drawable.mensaje);
	}

	private void construirAccioEmailEnviado(TextView name, 
			ImageView im) {
		name.setText(SENT_EMAIL);
		im.setImageResource(R.drawable.email);
	}

	private void construirAccioEmailRecibido(TextView name, 
			ImageView im) {
		name.setText(REC_EMAIL);
		im.setImageResource(R.drawable.email_off);
	}

	private void construirAccioLlamadaEntrante(TextView name, 
			ImageView im) {
		name.setText(INC_CALL);
		im.setImageResource(R.drawable.llamada);
	}

	private void construirAccioLlamadaSaliente(TextView name, 
			ImageView im) {
		name.setText(OUT_CALL);
		im.setImageResource(R.drawable.llamada_saliente);
	}

	private void construirAccioLlamadaPerdida(TextView name, 
			ImageView im) {
		name.setText(LOST_CALL);
		im.setImageResource(R.drawable.llamada_off);
	}
	
	@Override
	public Filter getFilter() {
		if (filtroLlamada == null) {
			filtroLlamada = new FilterLlamada();
		}
		return filtroLlamada;
	}
	
	// Filtros
		public class FilterLlamada extends Filter{

			@Override
			protected FilterResults performFiltering(CharSequence condiciones) {
				FilterResults results=new FilterResults();
				int idTipoAccion = Integer.parseInt(condiciones.toString());
				
				if(condiciones == null || condiciones.length()==0){
					results.values = items;
					results.count = items.size();
				}else{
					ArrayList<AccionItem> itemsFiltrados = new ArrayList<AccionItem>();

					for(AccionItem accion : items){
						if(idTipoAccion== COD_VER_TODOS){
							itemsFiltrados.add(accion);
						}else{
							if(accion.getIdTipoAccion() == idTipoAccion){
								itemsFiltrados.add(accion);
							}
						}
					}
					results.values = itemsFiltrados;
					results.count = itemsFiltrados.size();
				}
				return results;
			}

			@Override
			protected void publishResults(CharSequence constraint,
					FilterResults results) {
				if(results.count == 0){
					notifyDataSetInvalidated(); 
				}else{
					items = (ArrayList<AccionItem>) results.values;
					notifyDataSetChanged();
				}
			}
			
		}
		
		public class FilterAcciones extends Filter{

			@Override
			protected FilterResults performFiltering(CharSequence condiciones) {
				FilterResults results=new FilterResults();
				int idTipoAccion = Integer.parseInt(condiciones.toString());
				
				if(condiciones == null || condiciones.length()==0){
					results.values = items;
					results.count = items.size();
				}else{
					ArrayList<AccionItem> itemsFiltrados = new ArrayList<AccionItem>();

					for(AccionItem accion : items){
						if(idTipoAccion== COD_VER_TODOS){
							itemsFiltrados.add(accion);
						}else{
							if(accion.getIdTipoAccion() == idTipoAccion){
								itemsFiltrados.add(accion);
							}
						}
					}
					results.values = itemsFiltrados;
					results.count = itemsFiltrados.size();
				}
				return results;
			}

			@Override
			protected void publishResults(CharSequence constraint,
					FilterResults results) {
				if(results.count == 0){
					notifyDataSetInvalidated(); 
				}else{
					items = (ArrayList<AccionItem>) results.values;
					notifyDataSetChanged();
				}
			}
			
		}
}
